﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ForrajeriaDB; //ESTE USING VA EN TODOS LOS ELEMENTOS DE ESTA CAPA
using System.Data.SqlClient;
using System.Data;

namespace ForrajeriaDAL
{
    public class UsuariosDAL : AccesoDAL
    {
          private SqlCommand cmd; //var de comando sql

         #region VARIABLES PARA STORED QUE MANEJA EL OBJETO DE DAL

        private static string validar= "Usuarios_Validar";
        private static string insert = "Usuario_INSERT";
        private static string delete = "Usuario_DELETE";
        private static string getAll = "Usuario_GetALL";
        private static string getType = "Usuario_GetTipo";
        private static string comprobar = "Usuario_comprobarDisponibilidad";
        private static string updatePass = "Usuario_UpdatePassword";

        #endregion

          #region "Singleton"
        
      

        private static UsuariosDAL instance;

        private UsuariosDAL()
            : base()
        {
            
        }


        public static UsuariosDAL Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new UsuariosDAL();
                }
                return instance;
            }
        }

        #endregion

        #region Interfaz
        public List<UsuarioMO> GetAll()
        {
            List<UsuarioMO> lista = new List<UsuarioMO>();

            cmd = new SqlCommand(getAll, getConexion());
            cmd.CommandType = CommandType.StoredProcedure;

            try
            {
                SqlDataReader rea;
                opencon();
                rea = cmd.ExecuteReader();
                while (rea.Read())
                {
                    UsuarioMO aux = new UsuarioMO();
                    aux.CodigoUsuario = (int)rea["codigoUsuario"];
                    aux.Contrasenia = rea["contraseña"].ToString();
                    aux.Estado = rea["estado"].ToString();
                    aux.Roles = rea["roles"].ToString();
                    aux.User = rea["Usuario"].ToString();
                    if(rea["codigoEmpleado"].ToString() != "")
                    {
                        aux.CodigoEmpleado = int.Parse(rea["codigoEmpleado"].ToString());
                    }
                    if (rea["codigoCliente"].ToString() != "")
                    {
                        aux.CodigoCliente = int.Parse(rea["codigoCliente"].ToString());
                    }
                    
                    lista.Add(aux);

                    aux = null;
                }
                rea.Close();
                closecon();
                return lista;
            }
            catch (SqlException ex)
            {
                
                closecon();
                throw new Exception("Error de Base de Datos: " + ex.Message);
            }
            catch (Exception ex)
            {
                closecon();
                throw new Exception("Error Desconocido: " + ex.Message);
            }
            

        }

        public int Adicionar(UsuarioMO item)
        {
            int codigo = getCodigoInsert("usuario", "codigoUsuario");
            cmd = new SqlCommand(insert, getConexion());
            cmd.CommandType = CommandType.StoredProcedure;
            
            
	        cmd.Parameters.Add(new SqlParameter("@codigoUsuario",  codigo));
            cmd.Parameters.Add(new SqlParameter("@usuario",  item.User.ToLower()));
            cmd.Parameters.Add(new SqlParameter("@contraseña",  item.Contrasenia));
            cmd.Parameters.Add(new SqlParameter("@estado", item.Estado));
            cmd.Parameters.Add(new SqlParameter("@roles", item.Roles));
            if (item.CodigoEmpleado != null)
            {
                cmd.Parameters.Add(new SqlParameter("@codigoEmpleado", item.CodigoEmpleado));
            }
            if (item.CodigoCliente != null)
            {

                cmd.Parameters.Add(new SqlParameter("@codigoCliente",  item.CodigoCliente));
            }
            try
            {
                opencon();
                cmd.ExecuteNonQuery();
                closecon();
                return codigo;
            }

            catch (SqlException ex)
            {
                closecon();
                throw new Exception("Error de Base de Datos: " + ex.Message);
            }
            catch (Exception ex)
            {
                closecon();
                throw new Exception("Error Desconocido: " + ex.Message);
            }
            
        }

        public void Eliminar(int codigo)
        {
            cmd = new SqlCommand(delete, getConexion());
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add(new SqlParameter("@codigoUsuario",codigo));

            try
            {
                opencon();
                cmd.ExecuteNonQuery();
                closecon();

            }
            catch (SqlException ex)
            {
                closecon();
                throw new Exception("Error SQL: " + ex.Message);
            }
            catch (Exception ex)
            {
                closecon();
                throw new Exception("Error Desconocido: " + ex.Message); 
            }
        }

        public void Actualizar(UsuarioMO nuevoItem, UsuarioMO origItem)
        {
            throw new NotImplementedException();
        }

        #endregion

        public UsuarioMO valUser(UsuarioMO item)
        {
            SqlDataReader reader = null;
            
            try
            {

                cmd = new SqlCommand(validar, getConexion());
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add(new SqlParameter("@usr", item.User));
                cmd.Parameters.Add(new SqlParameter("@pas", item.Contrasenia));
                
                              
                opencon(); // abre coneccion 
                reader = cmd.ExecuteReader();
                UsuarioMO aux = new UsuarioMO();
                while (reader.Read())
                {

                   
                    aux.CodigoUsuario = int.Parse(reader["codigoUsuario"].ToString());
                    aux.User = reader["Usuario"].ToString();
                    aux.Contrasenia = reader["contraseña"].ToString();
                    aux.Estado = reader["estado"].ToString(); //campo que determina si es superusuario o no
                    aux.Roles = reader["roles"].ToString();
                }

                if (aux.CodigoUsuario != null)
                {
                    return aux;
                }
                else
                {
                    throw new Exception("user no encontrado");
                }
            }
            catch (Exception ex)
            {
                closecon();// cierra conexion
                throw ex; //en caso que no pueda leer desde la base de datos tira el hacia la siguiente capa 
            }
           finally //finalmente cierro el reader que use para traer la consulta esto es importante ya que por alguna razon podria quedar abierto generando una conexion sin uso en la bd que estaria todo el tiempo abierta
            {
                closeReader(reader);
                closecon();// cierra conexion

            }


        }


        public String getTipo(int codigo)
        {
            string reto;
            cmd = new SqlCommand(getType, getConexion());
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@id", codigo));

            try
            {
                opencon();
                reto = cmd.ExecuteScalar().ToString();
                closecon();
                return reto;
            }
            catch (SqlException ex)
            {
                closecon();
                throw new Exception("Error SQL: " + ex.Message);

            }

            catch (Exception ex)
            {
                closecon();
                throw new Exception("Error Desconocido: " + ex.Message);
            }



        }


        public string ModificarUserPass(UsuarioMO item)
        {
            cmd = new SqlCommand(updatePass, getConexion());

            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add(new SqlParameter("@pass",  item.Contrasenia));
            cmd.Parameters.Add(new SqlParameter("@nombre", item.User));

            try
            {
                opencon();
                cmd.ExecuteNonQuery();
                closecon();
                return "1";
            }
            catch (SqlException ex)
            {
                closecon();
                throw new Exception("Error SQL: " + ex.Message);

            }

            catch (Exception ex)
            {
                closecon();
                throw new Exception("Error Desconocido: " + ex.Message);
            }

        }

        public UsuarioMO getByName(string nombre)
        {
            cmd = new SqlCommand(comprobar, getConexion());
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add(new SqlParameter("@nombre",  nombre.ToLower()));
            SqlDataReader rea;

            try
            {
                opencon();
                rea = cmd.ExecuteReader();

                if (rea.Read())
                {

                    UsuarioMO aux = new UsuarioMO();
                    aux.CodigoUsuario = (int)rea["codigoUsuario"];
                    aux.Contrasenia = rea["contraseña"].ToString();
                    aux.Estado = rea["estado"].ToString();
                    aux.Roles = rea["roles"].ToString();
                    aux.User = rea["Usuario"].ToString();
                    if (rea["codigoEmpleado"].ToString() != "")
                    {
                        aux.CodigoEmpleado = int.Parse(rea["codigoEmpleado"].ToString());
                    }
                    if (rea["codigoCliente"].ToString() != "")
                    {
                        aux.CodigoCliente = int.Parse(rea["codigoCliente"].ToString());
                    }

                    closecon();
                    return aux;
                }
                else
                {
                    closecon();
                    return null;
                }
            }
            catch (SqlException ex)
            {
                closecon();
                throw new Exception("Error SQL: " + ex.Message);

            }

            catch (Exception ex)
            {
                closecon();
                throw new Exception("Error Desconocido: " + ex.Message);
            }
        }

        
    }



}

